Handle configure events in gdk
authorMatthias Clasen <mclasen@redhat.com>
Mon, 16 Jul 2018 00:11:56 +0000 (20:11 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Mon, 16 Jul 2018 00:23:45 +0000 (20:23 -0400)
The previous attempt at removing configure events entirely
was causing some dialogs not to show up under Wayland.
Presumably due to ordering issues with emitting ::size-change
out of the backend.

Instead, keep configure events in the event queue, but handle
them on the gdk side. This keeps the ordering intact, while
still removing configure events from the api. The dialogs
show up now.

gdk/gdkevents.c
gdk/gdkinternals.h
gdk/gdksurface.c
gtk/gtkmain.c
gtk/gtkwindow.c

index 02c61f389a4f6d67b74bc1fef0feca01dd879994..b25d27b366343ca7663de63c1f789ee21fc6d27a 100644 (file)
@@ -168,6 +168,9 @@ _gdk_event_emit (GdkEvent *event)
   if (gdk_drag_handle_source_event (event))
     return;
 
+  if (gdk_surface_handle_event (event))
+    return;
+
   if (_gdk_event_func)
     (*_gdk_event_func) (event, _gdk_event_data);
 }
index 69b5f844f1ee20f3c14d4e9d6f629709b4720197..f64f38dd4b559fe649ef20cd8df91e9ecc07b812 100644 (file)
@@ -291,6 +291,8 @@ GdkGLContext * gdk_surface_get_paint_gl_context (GdkSurface *surface,
 void gdk_surface_get_unscaled_size (GdkSurface *surface,
                                     int *unscaled_width,
                                     int *unscaled_height);
+gboolean gdk_surface_handle_event (GdkEvent       *event);
+
 
 /*****************************************
  * Interfaces provided by windowing code *
index 7140f9c2510a545255c201a204a6559cc5303333..9b7b0a22287e9b23537b266688ec6663c67dee8e 100644 (file)
@@ -5486,3 +5486,16 @@ gdk_synthesize_surface_state (GdkSurface     *surface,
 {
   gdk_surface_set_state (surface, (surface->state | set_flags) & ~unset_flags);
 }
+
+gboolean
+gdk_surface_handle_event (GdkEvent *event)
+{
+  if (gdk_event_get_event_type (event) == GDK_CONFIGURE)
+    {
+      g_signal_emit (gdk_event_get_surface (event), signals[SIZE_CHANGED], 0,
+                     event->configure.width, event->configure.height);
+      return TRUE;
+    }
+
+  return FALSE;
+}
index 5d4b71935e8759b9c9ee681587802962449ad10b..d92523a90dd1c65204c9bec73f8b4d6fcec16672 100644 (file)
@@ -1827,17 +1827,6 @@ gtk_main_do_event (GdkEvent *event)
         }
       break;
 
-    case GDK_CONFIGURE:
-      if (GTK_IS_WINDOW (event_widget) &&
-          _gtk_widget_get_surface (event_widget) == event->any.surface)
-        {
-          gtk_window_configure (GTK_WINDOW (event_widget),
-                                event->configure.width,
-                                event->configure.height);
-        }
-
-      break;
-
     case GDK_FOCUS_CHANGE:
     case GDK_GRAB_BROKEN:
       if (!_gtk_widget_captured_event (event_widget, event))
index 392d4ab268b7bff4e49f024ce7e85eea961da87a..295fbacee12d9a3d4bb9cbdbc5066ca942b497cc 100644 (file)
@@ -6869,6 +6869,7 @@ gtk_window_realize (GtkWidget *widget)
 
   gtk_widget_set_surface (widget, surface);
   g_signal_connect_swapped (surface, "notify::state", G_CALLBACK (surface_state_changed), widget);
+  g_signal_connect_swapped (surface, "size-changed", G_CALLBACK (gtk_window_configure), widget);
   gtk_widget_register_surface (widget, surface);
 
   GTK_WIDGET_CLASS (gtk_window_parent_class)->realize (widget);
@@ -7007,6 +7008,9 @@ gtk_window_unrealize (GtkWidget *widget)
   g_signal_handlers_disconnect_by_func (_gtk_widget_get_surface (widget),
                                         G_CALLBACK (surface_state_changed),
                                         widget);
+  g_signal_handlers_disconnect_by_func (_gtk_widget_get_surface (widget),
+                                        G_CALLBACK (gtk_window_configure),
+                                        widget);
 
   GTK_WIDGET_CLASS (gtk_window_parent_class)->unrealize (widget);